Но вместо этого — программа завершилась без вывода. Почему?
🧩Вопросы:
1. Почему worker не печатает "Worker stopped: ..."? 2. Что изменилось в context.WithCancelCause по сравнению с WithCancel? 3. Как безопасно читать причину отмены? 4. Как изменить worker, чтобы он корректно завершался? 5. Почему важно не блокироваться на `ctx.Done()`, если возможна гонка?
🛠Решение:
🔸 В Go 1.21 есть `context.WithCancelCause`, который позволяет задавать причину отмены. Но `context.Cause(ctx)` вернёт `nil`, **если ты используешь `context.WithCancel`**, либо, если `ctx.Done()` не был срабатывающим.
🔸 В этом коде `worker(ctx)` запускается и сразу блокируется на:
<-ctx.Done()
Но если отмена происходит **до** того, как `worker` успел начать слушать `ctx.Done()`, и ты используешь старую `WithCancel`, `context.Cause` вернёт `nil`.
🔸 **Правильный способ:**
Убедись, что `context.WithCancelCause` действительно используется и `ctx.Done()` слушается вовремя.
Для Go 1.21+ пример рабочий:
func worker(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("Worker stopped:", context.Cause(ctx)) return case <-time.After(100 * time.Millisecond): fmt.Println("Working...") } } }
🔸 Альтернатива для старых версий Go (<1.21):
ctx, cancel := context.WithCancel(context.Background()) ... fmt.Println("Worker stopped:", ctx.Err()) // вместо Cause
📌Вывод: Начиная с Go 1.21, `context.WithCancelCause` даёт более точный контроль за причинами отмены. Но горутины всё равно должны явно проверять `ctx.Done()` через `select`, иначе отмена может пройти незаметно.
Но вместо этого — программа завершилась без вывода. Почему?
🧩Вопросы:
1. Почему worker не печатает "Worker stopped: ..."? 2. Что изменилось в context.WithCancelCause по сравнению с WithCancel? 3. Как безопасно читать причину отмены? 4. Как изменить worker, чтобы он корректно завершался? 5. Почему важно не блокироваться на `ctx.Done()`, если возможна гонка?
🛠Решение:
🔸 В Go 1.21 есть `context.WithCancelCause`, который позволяет задавать причину отмены. Но `context.Cause(ctx)` вернёт `nil`, **если ты используешь `context.WithCancel`**, либо, если `ctx.Done()` не был срабатывающим.
🔸 В этом коде `worker(ctx)` запускается и сразу блокируется на:
<-ctx.Done()
Но если отмена происходит **до** того, как `worker` успел начать слушать `ctx.Done()`, и ты используешь старую `WithCancel`, `context.Cause` вернёт `nil`.
🔸 **Правильный способ:**
Убедись, что `context.WithCancelCause` действительно используется и `ctx.Done()` слушается вовремя.
Для Go 1.21+ пример рабочий:
func worker(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("Worker stopped:", context.Cause(ctx)) return case <-time.After(100 * time.Millisecond): fmt.Println("Working...") } } }
🔸 Альтернатива для старых версий Go (<1.21):
ctx, cancel := context.WithCancel(context.Background()) ... fmt.Println("Worker stopped:", ctx.Err()) // вместо Cause
📌Вывод: Начиная с Go 1.21, `context.WithCancelCause` даёт более точный контроль за причинами отмены. Но горутины всё равно должны явно проверять `ctx.Done()` через `select`, иначе отмена может пройти незаметно.
BY Go tests
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
The SSE was the first modern stock exchange to open in China, with trading commencing in 1990. It has now grown to become the largest stock exchange in Asia and the third-largest in the world by market capitalization, which stood at RMB 50.6 trillion (US$7.8 trillion) as of September 2021. Stocks (both A-shares and B-shares), bonds, funds, and derivatives are traded on the exchange. The SEE has two trading boards, the Main Board and the Science and Technology Innovation Board, the latter more commonly known as the STAR Market. The Main Board mainly hosts large, well-established Chinese companies and lists both A-shares and B-shares.
Should I buy bitcoin?
“To the extent it is used I fear it’s often for illicit finance. It’s an extremely inefficient way of conducting transactions, and the amount of energy that’s consumed in processing those transactions is staggering,” the former Fed chairwoman said. Yellen’s comments have been cited as a reason for bitcoin’s recent losses. However, Yellen’s assessment of bitcoin as a inefficient medium of exchange is an important point and one that has already been raised in the past by bitcoin bulls. Using a volatile asset in exchange for goods and services makes little sense if the asset can tumble 10% in a day, or surge 80% over the course of a two months as bitcoin has done in 2021, critics argue. To put a finer point on it, over the past 12 months bitcoin has registered 8 corrections, defined as a decline from a recent peak of at least 10% but not more than 20%, and two bear markets, which are defined as falls of 20% or more, according to Dow Jones Market Data.